<?php
/**
 * Created by PhpStorm.
 * Author: ljz
 * Date: 2023/5/10
 * Time: 11:29
 */

namespace App\backend\models;


use DateTimeInterface;
use Illuminate\Database\Eloquent\Model;
use App\common\models\BaseModel;
use Illuminate\Support\Facades\DB;

/**
 * Class AgentLevelModel
 * @package app\common\models
 */
class AgentLevel extends Model
{
    // 表名
    const table = 'agent_levels';
    const CREATED_AT = 'created_at';
    const UPDATED_AT = 'updated_at';

    // 状态
    const status = 0;

    const STATUS_0 = 0; // 禁用
    const STATUS_1 = 1; // 启用
    public static $statusMap = [
        self::STATUS_0      => '禁用',
        self::STATUS_1    => '启用',
    ];

    const IS_REDUCEIS_0 = 0; // 关闭
    const IS_REDUCEIS_1 = 1; // 开启
    public static $isReduceMap = [
        self::IS_REDUCEIS_0      => '关闭',
        self::IS_REDUCEIS_1    => '开启',
    ];

    public static $levelArr = [
        [
            'key' => self::LEVEL_1,
            'val' => self::LEVEL_MAP[self::LEVEL_1],
        ],
        [
            'key' => self::LEVEL_2,
            'val' => self::LEVEL_MAP[self::LEVEL_2],
        ],
        [
            'key' => self::LEVEL_3,
            'val' => self::LEVEL_MAP[self::LEVEL_3],
        ],
        [
            'key' => self::LEVEL_4,
            'val' => self::LEVEL_MAP[self::LEVEL_4],
        ],
        [
            'key' => self::LEVEL_5,
            'val' => self::LEVEL_MAP[self::LEVEL_5],
        ],
        [
            'key' => self::LEVEL_6,
            'val' => self::LEVEL_MAP[self::LEVEL_6],
        ],
    ];
    const LEVEL_1 = 1; // 一级
    const LEVEL_2 = 2; // 二级
    const LEVEL_3 = 3; // 三级
    const LEVEL_4 = 5; // 四级
    const LEVEL_5 = 6; // 五级
    const LEVEL_6 = 8; // 六级
    const LEVEL_MAP = [
        self::LEVEL_1    => '一级',
        self::LEVEL_2    => '二级',
        self::LEVEL_3    => '三级',
        self::LEVEL_4    => '四级',
        self::LEVEL_5    => '五级',
        self::LEVEL_6    => '六级',
    ];

    public static $upgradeStrategyArr = [
        [
            'text' => '分销订单总额',
            'val' => '',
            'unit' => '元',
        ],
        [
            'text' => '分销订单总数',
            'val' => '',
            'unit' => '个',
        ],
        [
            'text' => '一级分销订单总额',
            'val' => '',
            'unit' => '元',
        ],
        [
            'text' => '一级分销订单总数',
            'val' => '',
            'unit' => '个',
        ],
        [
            'text' => '自购订单总额',
            'val' => '',
            'unit' => '元',
        ],
        [
            'text' => '自购订单总数',
            'val' => '',
            'unit' => '个',
        ],
        [
            'text' => '下线人数',
            'val' => '',
            'unit' => '人',
        ],
        [
            'text' => '下线分销商人数',
            'val' => '',
            'unit' => '人',
        ],
        [
            'text' => '一级下线人数',
            'val' => '',
            'unit' => '人',
        ],
        [
            'text' => '一级下线分销商',
            'val' => '',
            'unit' => '人',
        ],
        [
            'text' => '指定商品',
            'val' => [
                [
                    'text' => '商品',
                    'val' => '',
                    'unit' => '',
                ],
            ],
            'unit' => '',
        ],
        [
            'text' => '已提现佣金金额',
            'val' => '',
            'unit' => '元',
        ],
        [
            'text' => '单笔充值金额',
            'val' => '',
            'unit' => '元',
        ],
        [
            'text' => '累计充值金额',
            'val' => '',
            'unit' => '元',
        ],
        [
            'text' => '一级下线到达指定分销等级人数',
            'val' => '',
            'unit' => '人',
            'level' => [
                'key' => '',
                'val' => '',
            ],
        ],
        [
            'text' => '所有下线到达指定分销等级人数',
            'val' => '',
            'unit' => '人',
            'level' => [
                'key' => '',
                'val' => '',
            ],
        ],
    ];

    public static $fallStrategyArr = [
        [
            'text' => '分销订单总额',
            'val' => '',
            'unit' => '元',
        ],
        [
            'text' => '分销订单总数',
            'val' => '',
            'unit' => '个',
        ],
        [
            'text' => '一级分销订单总额',
            'val' => '',
            'unit' => '元',
        ],
        [
            'text' => '一级分销订单总数',
            'val' => '',
            'unit' => '个',
        ],
        [
            'text' => '自购订单总额',
            'val' => '',
            'unit' => '元',
        ],
        [
            'text' => '自购订单总数',
            'val' => '',
            'unit' => '个',
        ],
        [
            'text' => '下线人数',
            'val' => '',
            'unit' => '人',
        ],
        [
            'text' => '下线分销商人数',
            'val' => '',
            'unit' => '人',
        ],
        [
            'text' => '一级下线人数',
            'val' => '',
            'unit' => '人',
        ],
        [
            'text' => '一级下线分销商',
            'val' => '',
            'unit' => '人',
        ],
        [
            'text' => '指定商品',
            'val' => [
                [
                    'text' => '商品',
                    'val' => '',
                    'unit' => '',
                ],
            ],
            'unit' => '',
        ],
        [
            'text' => '已提现佣金金额',
            'val' => '',
            'unit' => '元',
        ],
        [
            'text' => '单笔充值金额',
            'val' => '',
            'unit' => '元',
        ],
        [
            'text' => '累计充值金额',
            'val' => '',
            'unit' => '元',
        ],
        [
            'text' => '一级下线到达指定分销等级人数',
            'val' => '',
            'unit' => '人',
            'level' => [
                'key' => '',
                'val' => '',
            ],
        ],
        [
            'text' => '所有下线到达指定分销等级人数',
            'val' => '',
            'unit' => '人',
            'level' => [
                'key' => '',
                'val' => '',
            ],
        ],
    ];


    public $fillable = [
        'name', // 分销商等级名
        'level', // 分销商等级权重
        'first_level', // 一级分销比例
        'second_level', // 二级分销比例
        'upgrade_strategy', // 升级策略
        'fall_strategy', // 降级策略条件
        'upgraded', // 等级说明
        'status', // 是否禁用
        'is_reduce', // 降级策略
        'degradation_policy_settings', // 降级策略设置
        'fall_strategy_time', // 降级策略时间
        'grade_protection_period', // 等级保护期
        'fall_level', // 分销商降级级数
        'after_demotion', // 降级后升级条件
        'downgrading_time', // 保持降级时间
        'downgrading_method', // 降级方式
        'downgrading_method_time', // 降级方式天数
    ];

    /**
     * The attributes that should be casted to native types.
     * @var array
     */
    protected $casts = [
        'name'               => 'string',
        'level'         => 'integer',
        'first_level'       => 'decimal',
        'second_level'        => 'decimal',
        'upgrade_strategy'              => 'array',
        'fall_strategy' => 'string',
        'upgraded' => 'string',
        'status' => 'integer',
        'is_reduce' => 'integer',
        'degradation_policy_settings' => 'integer',
        'grade_protection_period' => 'integer',
        'fall_level' => 'integer',
        'after_demotion' => 'integer',
        'downgrading_time' => 'integer',
        'downgrading_method' => 'integer',
        'downgrading_method_time' => 'integer',
    ];

    protected $hidden = [
        'id'
    ];

    protected $appends = [
        'status_text',
    ];

    /**
     * 查询字段规则
     *
     * @return array
     */
    static public function rules()
    {
        return [
            'name' => 'required|string|max:100', // 分销商等级名
            'level' => 'required|integer', // 分销商等级权重
            'first_level' => 'required|numeric:2', // 一级分销比例
            'second_level' => 'required|numeric:2', // 二级分销比例
            'upgrade_strategy' => 'string', // 升级策略
            'fall_strategy' => 'string', // 降级策略条件
            'upgraded' => 'string', // 等级说明
            'is_reduce' => 'required|integer', // 降级策略
            'degradation_policy_settings'  => 'integer', // 降级策略设置
            'grade_protection_period'  => 'integer', // 等级保护期
            'fall_level'  => 'integer', // 分销商降级级数
            'after_demotion'  => 'integer', // 降级后升级条件
            'downgrading_time'  => 'integer', // 保持降级时间
            'downgrading_method'  => 'integer', // 降级方式
            'downgrading_method_time'  => 'integer', // 降级方式天数
        ];
    }

    /**
     * 字段验证返回错误信息
     *
     * @return array
     */
    static public function message()
    {
        return [
            'name.required' => '分销商等级名必填',
            'name.string' => '分销商等级名必须是字符',
            'name.max' => '分销商等级名最大100字符',
            'level.required' => '分销商等级权重必填',
            'level.integer' => '分销商等级权重必须是整数',
            'first_level.required' => '一级分销比例必填',
            'first_level.decimal' => '一级分销比例必须为数字，并且必须包含2位小数',
            'second_level.required' => '二级分销比例必填',
            'second_level.decimal' => '二级分销比例必须为数字，并且必须包含2位小数',
            'upgraded.string' => '等级说明必须是字符',
            'upgrade_strategy.string' => '等级说明必须是字符',
            'fall_strategy.string' => '降级策略条件必须是字符',
            'is_reduce.required' => '降级策略必填',
            'is_reduce.integer' => '降级策略必须是整数',
            'degradation_policy_settings.integer'  => '降级策略设置必须是整数', // 降级策略设置
            'fall_strategy_time.integer'  => '降级策略时间必须是整数', // 降级策略时间
            'grade_protection_period.integer'  => '等级保护期必须是整数', // 等级保护期
            'fall_level.integer'  => '分销商降级级数必须是整数', // 分销商降级级数
            'after_demotion.integer'  => '降级后升级条件必须是整数', // 降级后升级条件
            'downgrading_time.integer'  => '保持降级时间必须是整数', // 保持降级时间
            'downgrading_method.integer'  => '降级方式必须是整数', // 降级方式
            'downgrading_method_time.integer'  => '降级方式天数必须是整数', // 降级方式天数
        ];
    }

    /**
     * 格式化时间
     * @param DateTimeInterface $date
     * @return mixed
     */
    protected function serializeDate(DateTimeInterface $date)
    {
        return $date->format('Y-m-d H:i:s');
    }

    public function getStatusTextAttribute()
    {
        return self::$statusMap[$this->status] ?? '';
    }

    /**
     * 数据库 - 分页数据
     * @param $data //参数数组
     * @return array
     */
    static public function lists($page, $limit,$select_data = [], $where_data = [], $where_in_data = [])
    {
        $query = DB::table(self::table)
            ->select($select_data)
            ->where($where_data);

        if (!empty($where_in_data)) {
            $query->whereIn('id', $where_in_data);
        }

        return $query->paginate($limit)->toArray();
    }

    /**
     * 数据库 - 一条数据
     * @param $data //参数数组
     * @return array
     */
    static public function info($where_data = [], $select_data = [])
    {
        $data = DB::table(self::table)
            ->select($select_data)
            ->where($where_data)
            ->first();
        return $data;
    }

    /**
     * 数据库 - 删除数据
     * @param $data //参数数组
     * @return array
     */
    static public function deleteAgentLevel($where_data = [])
    {
        $data = DB::table(self::table)
            ->where($where_data)
            ->delete();
        return $data;
    }

    /**
     * 数据库 - 更新数据
     * @param $data //参数数组
     * @return array
     */
    static public function updatedData($where_data, $data)
    {
        $data = DB::table(self::table)->where($where_data)->update($data);
        return $data;
    }

    /**
     * 数据库 - 插入数据
     * @param $data //参数数组
     * @return array
     */
    static public function insertData($data)
    {
        $data = DB::table(self::table)->insert($data);
        return $data;
    }

}
